home *** CD-ROM | disk | FTP | other *** search
- # scale.tcl --
- #
- # This file defines the default bindings for Tk scale widgets and provides
- # procedures that help in implementing the bindings.
- #
- # SCCS: @(#) scale.tcl 1.12 96/04/16 11:42:25
- #
- # Copyright (c) 1994 The Regents of the University of California.
- # Copyright (c) 1994-1995 Sun Microsystems, Inc.
- #
- # See the file "license.terms" for information on usage and redistribution
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- #
-
- #-------------------------------------------------------------------------
- # The code below creates the default class bindings for entries.
- #-------------------------------------------------------------------------
-
- # Standard Motif bindings:
-
- bind Scale <Enter> {
- if $tk_strictMotif {
- set tkPriv(activeBg) [%W cget -activebackground]
- %W config -activebackground [%W cget -background]
- }
- tkScaleActivate %W %x %y
- }
- bind Scale <Motion> {
- tkScaleActivate %W %x %y
- }
- bind Scale <Leave> {
- if $tk_strictMotif {
- %W config -activebackground $tkPriv(activeBg)
- }
- if {[%W cget -state] == "active"} {
- %W configure -state normal
- }
- }
- bind Scale <1> {
- tkScaleButtonDown %W %x %y
- }
- bind Scale <B1-Motion> {
- tkScaleDrag %W %x %y
- }
- bind Scale <B1-Leave> { }
- bind Scale <B1-Enter> { }
- bind Scale <ButtonRelease-1> {
- tkCancelRepeat
- tkScaleEndDrag %W
- tkScaleActivate %W %x %y
- }
- bind Scale <2> {
- tkScaleButton2Down %W %x %y
- }
- bind Scale <B2-Motion> {
- tkScaleDrag %W %x %y
- }
- bind Scale <B2-Leave> { }
- bind Scale <B2-Enter> { }
- bind Scale <ButtonRelease-2> {
- tkCancelRepeat
- tkScaleEndDrag %W
- tkScaleActivate %W %x %y
- }
- bind Scale <Control-1> {
- tkScaleControlPress %W %x %y
- }
- bind Scale <Up> {
- tkScaleIncrement %W up little noRepeat
- }
- bind Scale <Down> {
- tkScaleIncrement %W down little noRepeat
- }
- bind Scale <Left> {
- tkScaleIncrement %W up little noRepeat
- }
- bind Scale <Right> {
- tkScaleIncrement %W down little noRepeat
- }
- bind Scale <Control-Up> {
- tkScaleIncrement %W up big noRepeat
- }
- bind Scale <Control-Down> {
- tkScaleIncrement %W down big noRepeat
- }
- bind Scale <Control-Left> {
- tkScaleIncrement %W up big noRepeat
- }
- bind Scale <Control-Right> {
- tkScaleIncrement %W down big noRepeat
- }
- bind Scale <Home> {
- %W set [%W cget -from]
- }
- bind Scale <End> {
- %W set [%W cget -to]
- }
-
- # tkScaleActivate --
- # This procedure is invoked to check a given x-y position in the
- # scale and activate the slider if the x-y position falls within
- # the slider.
- #
- # Arguments:
- # w - The scale widget.
- # x, y - Mouse coordinates.
-
- proc tkScaleActivate {w x y} {
- global tkPriv
- if {[$w cget -state] == "disabled"} {
- return;
- }
- if {[$w identify $x $y] == "slider"} {
- $w configure -state active
- } else {
- $w configure -state normal
- }
- }
-
- # tkScaleButtonDown --
- # This procedure is invoked when a button is pressed in a scale. It
- # takes different actions depending on where the button was pressed.
- #
- # Arguments:
- # w - The scale widget.
- # x, y - Mouse coordinates of button press.
-
- proc tkScaleButtonDown {w x y} {
- global tkPriv
- set tkPriv(dragging) 0
- set el [$w identify $x $y]
- if {$el == "trough1"} {
- tkScaleIncrement $w up little initial
- } elseif {$el == "trough2"} {
- tkScaleIncrement $w down little initial
- } elseif {$el == "slider"} {
- set tkPriv(dragging) 1
- set tkPriv(initValue) [$w get]
- set coords [$w coords]
- set tkPriv(deltaX) [expr $x - [lindex $coords 0]]
- set tkPriv(deltaY) [expr $y - [lindex $coords 1]]
- $w configure -sliderrelief sunken
- }
- }
-
- # tkScaleDrag --
- # This procedure is called when the mouse is dragged with
- # mouse button 1 down. If the drag started inside the slider
- # (i.e. the scale is active) then the scale's value is adjusted
- # to reflect the mouse's position.
- #
- # Arguments:
- # w - The scale widget.
- # x, y - Mouse coordinates.
-
- proc tkScaleDrag {w x y} {
- global tkPriv
- if !$tkPriv(dragging) {
- return
- }
- $w set [$w get [expr $x - $tkPriv(deltaX)] \
- [expr $y - $tkPriv(deltaY)]]
- }
-
- # tkScaleEndDrag --
- # This procedure is called to end an interactive drag of the
- # slider. It just marks the drag as over.
- #
- # Arguments:
- # w - The scale widget.
-
- proc tkScaleEndDrag {w} {
- global tkPriv
- set tkPriv(dragging) 0
- $w configure -sliderrelief raised
- }
-
- # tkScaleIncrement --
- # This procedure is invoked to increment the value of a scale and
- # to set up auto-repeating of the action if that is desired. The
- # way the value is incremented depends on the "dir" and "big"
- # arguments.
- #
- # Arguments:
- # w - The scale widget.
- # dir - "up" means move value towards -from, "down" means
- # move towards -to.
- # big - Size of increments: "big" or "little".
- # repeat - Whether and how to auto-repeat the action: "noRepeat"
- # means don't auto-repeat, "initial" means this is the
- # first action in an auto-repeat sequence, and "again"
- # means this is the second repetition or later.
-
- proc tkScaleIncrement {w dir big repeat} {
- global tkPriv
- if {![winfo exists $w]} return
- if {$big == "big"} {
- set inc [$w cget -bigincrement]
- if {$inc == 0} {
- set inc [expr abs([$w cget -to] - [$w cget -from])/10.0]
- }
- if {$inc < [$w cget -resolution]} {
- set inc [$w cget -resolution]
- }
- } else {
- set inc [$w cget -resolution]
- }
- if {([$w cget -from] > [$w cget -to]) ^ ($dir == "up")} {
- set inc [expr -$inc]
- }
- $w set [expr [$w get] + $inc]
-
- if {$repeat == "again"} {
- set tkPriv(afterId) [after [$w cget -repeatinterval] \
- tkScaleIncrement $w $dir $big again]
- } elseif {$repeat == "initial"} {
- set delay [$w cget -repeatdelay]
- if {$delay > 0} {
- set tkPriv(afterId) [after $delay \
- tkScaleIncrement $w $dir $big again]
- }
- }
- }
-
- # tkScaleControlPress --
- # This procedure handles button presses that are made with the Control
- # key down. Depending on the mouse position, it adjusts the scale
- # value to one end of the range or the other.
- #
- # Arguments:
- # w - The scale widget.
- # x, y - Mouse coordinates where the button was pressed.
-
- proc tkScaleControlPress {w x y} {
- set el [$w identify $x $y]
- if {$el == "trough1"} {
- $w set [$w cget -from]
- } elseif {$el == "trough2"} {
- $w set [$w cget -to]
- }
- }
-
- # tkScaleButton2Down
- # This procedure is invoked when button 2 is pressed over a scale.
- # It sets the value to correspond to the mouse position and starts
- # a slider drag.
- #
- # Arguments:
- # w - The scrollbar widget.
- # x, y - Mouse coordinates within the widget.
-
- proc tkScaleButton2Down {w x y} {
- global tkPriv
-
- if {[$w cget -state] == "disabled"} {
- return;
- }
- $w configure -state active
- $w set [$w get $x $y]
- set tkPriv(dragging) 1
- set tkPriv(initValue) [$w get]
- set coords "$x $y"
- set tkPriv(deltaX) 0
- set tkPriv(deltaY) 0
- }
-